package juc2.lock;

import java.util.concurrent.CyclicBarrier;

/**
 * CyclicBarrierDemo1
 * 多个工人线程分为两个阶段工作，用CyclicBarrier等待其他工人完成本阶段，再进入下一阶段工作。
 */
public class CyclicBarrierDemo1 {
    public static void main(String[] args) {
        int workerCount = 3; // 3个工人
        // 创建CyclicBarrier：3个线程参与，屏障动作是“阶段总结”
        CyclicBarrier barrier = new CyclicBarrier(workerCount, () -> {
            System.out.println("===== 所有工人完成当前阶段，开始总结 =====");
        });

        // 创建3个工人线程
        for (int i = 0; i < workerCount; i++) {
            int workerId = i + 1;
            new Thread(() -> {
                try {
                    // 第一阶段工作
                    System.out.println("工人" + workerId + "：开始第一阶段工作");
                    Thread.sleep((long) (Math.random() * 1000)); // 模拟不同耗时
                    System.out.println("工人" + workerId + "：完成第一阶段工作，等待其他人...");
                    barrier.await(); // 到达第一阶段屏障

                    // 第二阶段工作（屏障重置后可再次使用）
                    System.out.println("工人" + workerId + "：开始第二阶段工作");
                    Thread.sleep((long) (Math.random() * 1000));
                    System.out.println("工人" + workerId + "：完成第二阶段工作，等待其他人...");
                    barrier.await(); // 到达第二阶段屏障

                    System.out.println("工人" + workerId + "：所有阶段完成，下班！");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

